package com.zhoug.common3.http;

import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import retrofit2.http.Path;
import retrofit2.http.QueryMap;
import retrofit2.http.Streaming;
import retrofit2.http.Url;

/**
 * 注意事项,不直接继承接口
 * @Author: zhoug
 * @Date: 2025-01-20
 * @Description:
 */
public interface HttpMethodApi {
    /**
     * get方法
     *
     * @param url    完整的url地址 如:http://api.tianditu.gov.cn/v2/search
     * @param params 参数
     * @return 可观察者
     */
    @GET
    Observable<ResponseBody> getByUrl(@Url String url, @QueryMap Map<String, Object> params);

    /**
     * get方法
     *
     * @param path   相对baseUrl的请求地址 如: v2/search
     * @param params 参数
     * @return 可观察者
     */
    @GET("{url}")
    Observable<ResponseBody> getByPath(@Path(value = "url", encoded = true) String path, @QueryMap Map<String, Object> params);

    /**
     * 文件下载
     *
     * @param url 完整的url地址 如:http://api.tianditu.gov.cn/img/1321.png
     * @return 请求响应
     */
    @GET
    @Streaming
    Call<ResponseBody> download(@Url String url);

    /**
     * 支持文件上传的form表单
     *
     * @param path   相对baseUrl的请求地址 如: v2/search
     * @param params 参数
     * @param files  文件
     * @return 可观察者
     */
    @Multipart
    @POST("{url}")
    Observable<ResponseBody> postByPath(@Path(value = "url", encoded = true) String path, @PartMap() Map<String, RequestBody> params, @Part List<MultipartBody.Part> files);

    /**
     * 支持文件上传的form表单
     *
     * @param url    完整的url地址 如:http://api.tianditu.gov.cn/v2/search
     * @param params 参数
     * @param files  文件
     * @return 可观察者
     */
    @Multipart
    @POST
    Observable<ResponseBody> postByUrl(@Url String url, @PartMap() Map<String, RequestBody> params, @Part List<MultipartBody.Part> files);


    /**
     * 不支持文件上传的form表单
     *
     * @param url    相对baseUrl的请求地址 如: v2/search
     * @param params 参数
     * @return 可观察者
     */
    @FormUrlEncoded
    @POST("{url}")
    Observable<ResponseBody> postByPath(@Path(value = "url", encoded = true) String url, @FieldMap() Map<String, RequestBody> params);

    /**
     * 不支持文件上传的form表单
     *
     * @param url    完整的url地址 如:http://api.tianditu.gov.cn/v2/search
     * @param params 参数
     * @return 可观察者
     */
    @FormUrlEncoded
    @POST
    Observable<ResponseBody> postByUrl(@Url String url, @FieldMap() Map<String, RequestBody> params);

    /**
     * post请求 参数在body中
     * @param path 相对baseUrl的请求地址 如: v2/search
     * @param params 参数
     * @return 可观察者
     */
    @POST("{url}")
    Observable<ResponseBody> postByPath(@Path(value = "url", encoded = true) String path, @Body() Object params);

    /**
     * post请求 参数在body中
     * @param path 完整的url地址 如:http://api.tianditu.gov.cn/v2/search
     * @param params 参数
     * @return 可观察者
     */
    @POST
    Observable<ResponseBody> postByUrl(@Url String path, @Body() Object params);



}
